﻿using AVGDialogs;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AVGDialogTester
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            avg = new AVGDialog(this);
        }
        AVGDialog avg;
        private void button1_Click(object sender, EventArgs e)
        {
            avg.Clear();
            avg.BeginSkipSection("系统向你介绍了基本的对话功能。");
            avg.SetSpeaker("系统");
            avg.Text("你好，初次见面。");
            avg.Text("欢迎来到 AVGDialog 的演示DEMO。");
            avg.Text("接下来，我将演示这个对话系统的机能。");
            avg.Text("首先，是最普通的消息。");
            avg.Text("是非常普通的消息，有说话人，有消息内容，你可以在这里写各种东西。");
            avg.SetSpeakerColor(Color.Cyan);
            avg.HideMessage();
            avg.Delay(500);
            avg.SetSpeaker("另一个系统(?)");
            avg.Text("你可以用SetSpeaker方法更改说话人的名称。");

            avg.HideMessage();
            avg.Delay(500);
            avg.ResetSpeakerColor();
            avg.Text("系统", "当然，你也可以直接使用两个参数的 SetMessage 方法，快捷指定说话人。");
            avg.Text("不管哪种的说话人都会一直继承，");
            avg.ClearSpeaker();
            avg.Text("……直到调用ClearSpeaker方法为止。");
            avg.Text("当然，这个状态也是持续的。");
            avg.SetTextSize(AVGDialog.AVGTextSizes.Small);
            avg.Text("使用这种方法，也可以做出内心独白的效果哦。");
            avg.SetTextSize(AVGDialog.AVGTextSizes.Normal);
            avg.BeginSkipSection("系统向你介绍了移动对话框功能。");

            avg.Text("系统", "当然，如果想要移动对话窗口，也是可以做到的。");
            avg.MovePosition(0.5, 0.5);
            avg.Text("系统", "只需要调用 MovePosition 方法即可。");
            avg.Text("移动窗口是按照百分比来移动的，例如现在就是 MovePosition(0.5,0.5) 的效果。");
            avg.MovePosition(0, 0);
            avg.Text("这个是 MovePosition(0,0) ，");
            avg.MovePosition(1, 1);
            avg.Text("而这个是 MovePosition(1,1) .");
            avg.MovePosition(0.5, 0.5);
            avg.Text("这样在制作一些教程演示时，会非常的有用。请一定要好好利用这一点。");
            avg.ResetPosition();
            avg.Text("调用 ResetPosition 即可回到默认的对话框位置。");

            avg.BeginSkipSection("系统向你介绍了选择肢功能。");
            avg.Text("当然，别忘了最重要的功能，");

            avg.SetTextSize(AVGDialog.AVGTextSizes.Large);
            avg.StrikeScreen(AVGDialog.AVGStrikeScreenMode.Both, 5, 10);
            avg.Text("选择肢！");
            avg.SetSelectionColor(1, Color.Yellow);
            avg.SetTextSize(AVGDialog.AVGTextSizes.Normal);
            avg.Text("准备好了吗？");
            avg.AddSelection("准备好啦!!!");
            avg.Text("好！很有精神！");
            avg.Text("那么接下来请回答以下问题：");
            avg.Text("这个库最多能够显示多少个选项？");
            avg.AddSelection("A. 0-3个","B. 1-5个","C. 2-5个","D. 1-4个","E. 不知道");

            avg.GotoIfSelection("ansA", 1);
            avg.GotoIfSelection("ansB", 2);
            avg.GotoIfSelection("ansC", 3);
            avg.GotoIfSelection("ansD", 4);
            avg.GotoIfSelection("ansE", 5);
            avg.Text("你是怎么跑到这个选择肢里来的？");
            avg.Text("因为软件BUG？还是高能电子穿越宇宙轰击了计算机的记忆体？");
            avg.Text("总之，这里不是你该来的地方，请试着修复问题，回到正轨吧。");
            avg.Goto("endAns");

            avg.Label("ansA");
            avg.Text("很遗憾，你答错了。");
            avg.Text("如果有0个选项，那么这个选择肢存在的意义又是什么呢？");
            avg.Goto("correctAns");


            avg.Label("ansB");
            avg.SetTextColor(Color.LimeGreen);
            avg.Text("恭喜你，你答对了。");
            avg.ResetTextColor();
            avg.Text("不知道你是通过阅读源代码，还是通过逻辑推理得来的呢？");
            avg.Text("如果是后者的话，或许你很有成为侦探的天赋哦。");
            avg.Goto("explainAns");


            avg.Label("ansC");
            avg.Text("很遗憾，你答错了。");
            avg.Text("不知道你还是否记得刚刚的「准备好啦!!!」");
            avg.Text("那个就是只有一个选项的选择肢。可以用来推动故事发展。");
            avg.Text("由于只有一个选项，因此可以在单组对话中多次出现。");
            avg.Goto("correctAns");


            avg.Label("ansD");
            avg.Text("很遗憾，你答错了。");
            avg.Text("不知道你有没有注意到，刚刚的那个题目，就是5个选项的选择肢");
            avg.Goto("correctAns");


            avg.Label("ansE");
            avg.Text("很好，你很诚实。");
            avg.Text("不过，即使没有阅读过源代码，你也可以试着推理一下答案。");
            avg.Goto("explainAns");


            avg.Label("explainAns");
            avg.BeginSkipSection("系统向你介绍了如何推理出正确答案。");
            avg.Text("至于推理过程，A选项中，如果有0个选项的话，那么就没有选择肢存在的意义了。");
            avg.Text("所以A选项错误。");
            avg.Text("C选项的话，不知道你还是否记得刚刚的「准备好啦!!!」");
            avg.Text("那个就是只有一个选项的选择肢。可以用来推动故事发展。");
            avg.Text("由于只有一个选项，因此可以在单组对话中多次出现。");
            avg.Text("因此，可以存在1个选项的选择肢，所以C选项PASS。");
            avg.Text("至于D选项，刚刚的那个题目，其实就是五个选项的选择肢");
            avg.Text("因此也可以排除。");
            avg.Text("至此，已经得出唯一一个正确的B选项，所以「不知道」也不能选择了。");
            avg.Goto("endAns");


            avg.Label("correctAns");
            avg.Text("正确答案是B选项：1-5个。");
            avg.Label("endAns");

            avg.BeginSkipSection("系统向你介绍了选择肢API的使用方法。");
            avg.Text("怎么样，这个选择肢功能还不错吧！");
            avg.Text("要使用选择肢功能，请调用AddSelection方法，");
            avg.Text("你可以在参数里填写1-5个选项，");
            avg.Text("当调用Begin之后，你可以调用GetLastSelection获取上一次选择的内容，");
            avg.Text("返回值的范围是1-5。");
            avg.Text("不过，由于每一组对话只会保存一个选择肢结果，");
            avg.Text("如果想要多个选项，请注意保存上一次选择的结果");
            avg.Text("你也可以用Label和GotoIf等方法控制脚本的流程。");
            avg.Text("不过需要注意的是，一旦脚本开始后，就不能在修改了。");
            avg.Text("因此请务必提前写好所有的情况，而不是用Exec偷偷添加新的文本。");

            avg.BeginSkipSection("系统向你介绍了BACKLOG。");
            avg.Text("最后再介绍一个功能，最最经典的BACKLOG。");
            avg.Text("不知道你有没有注意到左上角的那个「履历」按钮，又或许，你已经点击过至少一次了。");
            avg.Text("现在请点击那个按钮，这样就能看到之前的对话历史和选项了。");

            avg.BeginSkipSection("系统向你介绍了跳过API的使用方法。");
            avg.Text("另外，为了追随最新的潮流，这里还特别添加了剧情跳过和剧情梗概的API。");
            avg.Text("只需要调用 BeginSkipSection 方法，填入剧情梗概，");
            avg.Text("即可开始一段可以跳过的剧情。");
            avg.Text("可以跳过的剧情在遇到 EndSkipSection 后结束，当点击跳过之后，剧情便会快进到此处。");
            avg.Text("当然，如果遇到一段对话末尾，或者通过 BeginSkipSection 开始了一段新的可跳过剧情，");
            avg.Text("亦或者是遇到了选择肢，都会让剧情跳过部分结束。");
            avg.EndSkipSection();
            avg.Text("接下来请试用一下剧情跳过功能。");
            avg.Text("我会从1数到100。");
            avg.Text("请通过右上角的跳过按钮跳过这一段。");

            avg.BeginSkipSection("系统从1数到了100");
            avg.Text("1...2...3...4...5...6...7...8...9...10...");
            avg.Text("11...12...13...14...15...16...17...18...19...20...");
            avg.Text("21...22...23...24...25...26...27...28...29...30...");
            avg.Text("31...32...33...34...35...36...37...38...39...40...");
            avg.Text("41...42...43...44...45...46...47...48...49...50...");
            avg.Text("51...52...53...54...55...56...57...58...59...60...");
            avg.Text("61...62...63...64...65...66...67...68...69...70...");
            avg.Text("71...72...73...74...75...76...77...78...79...80...");
            avg.Text("81...82...83...84...85...86...87...88...89...90...");
            avg.SetTextSize(AVGDialog.AVGTextSizes.Small);
            avg.Text("91...92...93...94...");
            avg.Text("95...96...97...");
            avg.Text("98...99........................");
            avg.SetTextSize(AVGDialog.AVGTextSizes.Large);
            avg.StrikeScreen(AVGDialog.AVGStrikeScreenMode.Both, 5, 10);
            avg.Text("100!");
            avg.SetTextSize(AVGDialog.AVGTextSizes.Normal);
            avg.Text("居然读到了最后呢。");
            avg.Text("有这样的毅力，无论做什么都会成功的吧！");
            avg.EndSkipSection();

            avg.Text("跳过部分结束了，不知道你对跳过功能的感觉怎么样？");

            avg.BeginSkipSection("系统介绍了最终开启对话所需要的注意事项。");
            avg.Text("以上，就是所有的机能演示。");
            avg.Text("演示中还出现了一些其它功能，例如字体大小和颜色，延迟等。");
            avg.Text("你可以去演示项目的源代码里看到具体的用法。");
            avg.Text("最后，完成对话的编写后，别忘了调用Begin方法开始对话哦。");

            avg.Begin();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            avg.Clear();
            avg.SetSpeaker("系统");
            avg.SetTextSize(AVGDialog.AVGTextSizes.Small);
            avg.SetSpeakerColor(Color.Lime);
            avg.Text("这是一个小小的字体。");
            avg.SetTextSize(AVGDialog.AVGTextSizes.Large);
            
            avg.Text("而这个是—");
            avg.SetSpeakerColor(Color.Blue);
            avg.SetTextColor(Color.Red);
            avg.StrikeScreen(AVGDialog.AVGStrikeScreenMode.Vertical,5,10);
            avg.Text("超大字体!!!");
            avg.SetTextSize(AVGDialog.AVGTextSizes.Normal);
            avg.ResetTextColor();
            avg.ResetSpeakerColor();

            avg.Text("3+5=?");
            avg.Text("答案是：");
            avg.Text(() => (3 + 5).ToString());

            avg.HideMessage();
            avg.Label("begin");
            avg.AddSelection("如果上来就是一个选项","会发生什么(会回到开头）");
            avg.Delay(500);
            Random random = new Random();
            avg.AddSelection(()=> Enumerable.Range(0,5).Select(r => random.Next(1,7).ToString()).ToArray());
            avg.Delay(500);
            avg.Text("试试延迟效果怎么样");
            avg.HideMessage();
            avg.Delay(500);
            avg.Exec(() => { MessageBox.Show("Test"); });
            avg.Text("试试延迟效果怎么样");
            avg.GotoIfSelection("begin",2);
            avg.Begin();
        }
    }
}
